package com.grupobbva.iici.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.grupobbva.iici.serializable.Menu;
import com.grupobbva.iici.serializable.Perfil;
import com.grupobbva.iici.serializable.PermisoPerfil;
import com.grupobbva.iici.service.PerfilService;
import com.grupobbva.iici.util.FiltroDTO;

@Service("perfilService")
@Transactional(readOnly=true)
public class PerfilServiceImpl extends BaseServiceImpl implements PerfilService {


	private static Logger log = Logger.getLogger(PerfilServiceImpl.class);

//	@Override
	public Vector obtenerCodigoPerfil(String codPerfil) {
		log.info("obtenerCodigoPerfil ::"+codPerfil);
		
		
		FiltroDTO filtroDTO=new FiltroDTO();
//		filtroDTO.addParametro("codPerfil",codPerfil);
		filtroDTO.addParametroLike("codPerfil",codPerfil);
		List lst=obtenerEntidadesPorFiltros(Menu.class, filtroDTO);
		Vector lst2=new Vector(lst);
		return lst2;
	}

//	@Override
	public PermisoPerfil obtenerPermisoPerfilxTipAccxValorRCP(String usuario,
			String codigoCargo, String codigoOficina) {
		log.info("obtenerPermisoPerfilxTipAccxValorRCP ::"+usuario+","+codigoCargo+","+codigoOficina);
		PermisoPerfil permisoPerfil=null;
		FiltroDTO filtroUsuario=new FiltroDTO();
		filtroUsuario.addParametro("tipoAcceso", 1);
		filtroUsuario.addParametro("valorRCP", usuario);
		
		FiltroDTO filtroCargo=new FiltroDTO();
		filtroCargo.addParametro("tipoAcceso", 2);
		filtroCargo.addParametro("valorRCP", codigoCargo);
		
		FiltroDTO filtroOficina=new FiltroDTO();
		filtroOficina.addParametro("tipoAcceso", 3);
		filtroOficina.addParametro("valorRCP", codigoOficina);
		
		
		List lstUsuario=obtenerEntidadesPorFiltros(PermisoPerfil.class, filtroUsuario);
		if(lstUsuario==null||lstUsuario.size()==0){
			lstUsuario=obtenerEntidadesPorFiltros(PermisoPerfil.class, filtroCargo);
			if(lstUsuario==null||lstUsuario.size()==0){
				lstUsuario=obtenerEntidadesPorFiltros(PermisoPerfil.class, filtroOficina);
			}
		}
		if(lstUsuario!=null &&lstUsuario.size()>0){
			permisoPerfil=(PermisoPerfil)lstUsuario.get(0);
			Perfil perfil=obtenerEntidadPorCodigo(Perfil.class, permisoPerfil.getCodPerfil());
			permisoPerfil.setPerfil(perfil);
		}		
		return permisoPerfil;
	}
	
	public List<Perfil> obtenerTodosPerfiles(int flag) {
		List lstPerfil=obtenerEntidadesPorFiltros(Perfil.class, null);
		List<Perfil> lstSalida=null;
		if(lstPerfil!=null&&lstPerfil.size()>0){
			lstSalida=new ArrayList<Perfil>();
			
			for(Object obj:lstPerfil){
				Perfil perfil=(Perfil)obj;
				if(flag<0)
                {
						if (!perfil.getCodPerfil().equals("1")) {							
							lstSalida.add(perfil);
						}
                }
				 else{
				 	
					 lstSalida.add(perfil);
				 }
			}
		}
		
		return lstSalida;
	}
	public List<PermisoPerfil> obtenerTodosPerfilPermiso(int flag) {
		List<PermisoPerfil> lstSalida=null;
		List lstPermisoPerfil=obtenerEntidadesPorFiltros(PermisoPerfil.class, null);
		if (lstPermisoPerfil != null && lstPermisoPerfil.size() > 0) {
			lstSalida=new ArrayList<PermisoPerfil>();
			
			for(Object obj:lstPermisoPerfil) {
				PermisoPerfil permisoPerfil=(PermisoPerfil)obj;
	
					Perfil perfil=obtenerEntidadPorCodigo(Perfil.class, permisoPerfil.getCodPerfil());
					
	               if(flag<0)
	               {
						if (!permisoPerfil.getCodPerfil().equals("1")) {
							permisoPerfil.setPerfil(perfil);
							permisoPerfil.setDesPerfil(perfil.getDesPerfil());
							lstSalida.add(permisoPerfil);
						}
	               }
	               else{
	            	   	permisoPerfil.setPerfil(perfil);
						permisoPerfil.setDesPerfil(perfil.getDesPerfil());
						lstSalida.add(permisoPerfil);						
	               }					
				}			
		}
		return lstSalida;
	}

	@Transactional(rollbackFor=Exception.class)
	public void eliminarPermisoPerfil(String codPerfil, Integer tipoAcceso,
			String valorRCP) {
		FiltroDTO filtroDTO=new FiltroDTO();
		filtroDTO.addParametro("codPerfil", codPerfil);
		filtroDTO.addParametro("tipoAcceso", tipoAcceso);
		filtroDTO.addParametro("valorRCP", valorRCP);
		List lst=obtenerEntidadesPorFiltros(PermisoPerfil.class, filtroDTO);
		for(Object obj:lst){
			PermisoPerfil permisoPerfil=(PermisoPerfil)obj;
			eliminar(permisoPerfil);
		}
	}

//	@Override
	public PermisoPerfil obtenerPermisoPerfilCodigo(String codPerfil,
			Integer tipoAcceso, String valorRCP) {
		FiltroDTO filtroDTO=new FiltroDTO();
		filtroDTO.addParametro("codPerfil", codPerfil);
		filtroDTO.addParametro("tipoAcceso", tipoAcceso);
		filtroDTO.addParametro("valorRCP", valorRCP);
		
		List lst=obtenerEntidadesPorFiltros(PermisoPerfil.class, filtroDTO);
		if(lst!=null&&lst.size()>0){
			return (PermisoPerfil)lst.get(0);
		}
		return null;
	}

	@Transactional(rollbackFor=Exception.class)
	public void modificar(PermisoPerfil permisoPerfilNew,
			PermisoPerfil permisoPerfilOld) {
		
		PermisoPerfil permisoPerfil=obtenerPermisoPerfilCodigo(permisoPerfilOld.getCodPerfil(),permisoPerfilOld.getTipoAcceso(),permisoPerfilOld.getValorRCP());
		eliminar(permisoPerfil);
		registrar(permisoPerfilNew);		
	}


}
